﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../impl/head.h"
#include "list_impl.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos_box
{
    ////////////////////////////////////////////////////////////////////////////////////
    // 

    static list_impl::POOL * pool_ptr = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // list_impl

    list_impl::list_impl()
    {
        m_item_iter = m_item_list.begin();
    }

    list_impl::~list_impl()
    {
        term();
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    int list_impl::get_addr( POOL *** pppPool, LIST *** pppList )
    {
        int ret = 0;
        if( pppPool )
        {
            *pppPool = &pool_ptr;
        }
        if( pppList )
        {
            *pppList = 0;
        }
        return ret;
    }

    int list_impl::static_user_init()
    {
        int ret = 0;
        list_iter::init_all();
        return ret;
    }

    int list_impl::static_user_term()
    {
        int ret = 0;
        list_iter::term_all();
        return ret;
    }

    int list_impl::init()
    {
        int ret = 0;
        return ret;
    }

    int list_impl::term()
    {
        int ret = 0;
		release_all();
        m_item_iter = m_item_list.begin();
        return ret;
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // add back
    // 
    int list_impl::push_back( xos::i_release * pObj )
    {
        int ret = 0;
        m_item_list.push_back( pObj );
        return ret;
    }

    // 
    // return last, but not remove
    // 
    xos::i_release * list_impl::back( xos::i_release ** ppObj )
    {
		xos::i_release * pObj = 0;
		if( m_item_list.size() > 0 )
		{
			pObj = m_item_list.back();
		}
		if( ppObj )
		{
			*ppObj = pObj;
		}
        return pObj;
    }

    // 
    // pop back
    // 
    int list_impl::pop_back()
    {
        int ret = 0;
        m_item_list.pop_back();
        return ret;
    }

    // 
    // add front
    // 
    int list_impl::push_front( xos::i_release * pObj )
    {
        int ret = 0;
        m_item_list.push_front( pObj );
        return ret;
    }

    // 
    // return first, but not remove
    // 
    xos::i_release * list_impl::front( xos::i_release ** ppObj )
    {
		xos::i_release * pObj = 0;
		if( m_item_list.size() > 0 )
		{
			pObj = m_item_list.front();
		}
        if( ppObj )
        {
            *ppObj = pObj;
        }
        return pObj;
    }

    // 
    // pop front
    // 
    int list_impl::pop_front()
    {
        int ret = 0;
        m_item_list.pop_front();
        return ret;
    }

    // 
    // remove with xos::i_release *
    // 
    int list_impl::remove( xos::i_release * pObj )
    {
        int ret = 0;
        m_item_list.remove( pObj );
        return ret;
    }

    // 
    // point to next after remove.
    // 
    xos::i_release * list_impl::remove()
    {
        xos_list::ITEM_ITER iter = m_item_iter;
        xos::i_release * pRet = 0;
        if( iter != m_item_list.end() )
        {
            m_item_iter++;
            pRet = *iter;
            m_item_list.erase( iter );
        }
        return pRet;
    }

    // 
    // reset list iter
    // 
    int list_impl::reset()
    {
        m_item_iter = m_item_list.begin();
        return 0;
    }

    // 
    // null if to end
    // 
    xos::i_release * list_impl::next()
    {
        xos::i_release * pRet = 0;
        if (m_item_iter != m_item_list.end())
        {
            pRet = *m_item_iter++;
        }
        return pRet;
    }

    // 
    // 得到list的前后向迭代器
    // 
    i_list_iter * list_impl::rbegin()
    {
        list_iter * pRet = 0;
        xos_stl::init_pool_item( pRet, false );
        pRet->set( &m_item_list, false );
        pRet->init();
        return pRet;
    }

    i_list_iter * list_impl::begin()
    {
        list_iter * pRet = 0;
        xos_stl::init_pool_item( pRet, true );
        pRet->set( &m_item_list, true );
        pRet->init();
        return pRet;
    }

    // 
    // list operation
    // 
    int list_impl::add_to_front( xos_box::i_list * pList )
    {
        int ret = 0;
        while( xos::i_release * pUnk = pList->front( 0 ) )
        {
            pList->pop_front();
            push_front( pUnk );
        }
        return ret;
    }

    int list_impl::add_to_tail( xos_box::i_list * pList )
    {
        int ret = 0;
        while( xos::i_release * pUnk = pList->front( 0 ) )
        {
            pList->pop_front();
            push_back( pUnk );
        }
        return ret;
    }

    int list_impl::swap( xos_box::i_list * pList )
    {
        int ret = 0;
        list_impl * pListImpl = ( list_impl* )pList;
        m_item_list.swap( pListImpl->m_item_list );
        return ret;
    }

    // 
    // release all
    // 
    int list_impl::release_all()
    {
        int ret = 0;
        m_item_list.put_back_to_pool( true );
        return ret;
    }

    // 
    // remove all
    // 
    int list_impl::clear()
    {
        int ret = 0;
        m_item_list.clear();
        return ret;
    }

    // 
    // list item num
    // 
    int list_impl::size()
    {
        return ( int )m_item_list.size();
    }

    // 
    // unlock/lock
    // 
    int list_impl::un_lock()
    {
        int ret = 0;
		m_item_list.un_lock();
        return ret;
    }

    // 
    // unlock/lock
    // 
    int list_impl::lock()
    {
        int ret = 0;
		m_item_list.lock();
        return ret;
    }
} // xos
